package cn.tedu.seckill.consume;

import cn.tedu.seckill.RabbitCompUtils;
import cn.tedu.seckill.mapper.SeckillMapper;
import com.jt.common.pojo.Success;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class SeckillConsumer {
    /*
       实现消费逻辑的api方法,方法的参数,就是接受的消息对象
     */
    @Autowired(required = false)
    private SeckillMapper seckillMapper;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @RabbitListener(queues = {RabbitCompUtils.Q1})
    public void consume(String msg){
        //msg="18899995794/1";
        /**
         *  1 解析消息 谁--userPhone 什么--seckillId
         *  2 判断秒杀是否成功,number库存减成功,就算秒杀成功
         *      不成功:打印秒杀结束,买完了
         *      成功:封装成功信息 Success
         */
        Long userPhone=Long.parseLong(msg.split("/")[0]);
        Long seckillId=Long.parseLong(msg.split("/")[1]);
        //调用redis的计步器,对数字进行减库存操作
        Long decrement = redisTemplate.opsForValue().decrement("seckill_" + seckillId);
        if(decrement<0l){
            //说明在redis中,已经有足够的消费端,代表用户秒杀了该商品
            System.out.println("已经卖完了");
            return;
        }
        //update seckill set number=number-1 seckillId=#{} and
        //number>0 and time正确
        Date nowTime=new Date();
        int result=seckillMapper.decrNumber(seckillId,nowTime);
        //result不是0就是1
        if(result==0){
            //不是时间不合法,就是库存没了
            System.out.println("该用户"+userPhone+"秒杀失败");
            return;
        }
        //result==1 减库存成功,写入success数据,记录谁成功秒杀了什么
        Success suc=new Success();
        suc.setCreateTime(nowTime);
        suc.setSeckillId(seckillId);
        suc.setUserPhone(userPhone);
        seckillMapper.insertSuccess(suc);
    }
}
